import { ref, onMounted } from 'vue'

/**
 * 处理滑动相关的逻辑
 * @param {ref|Object} currentIndex - 当前激活的索引，可以是ref或具有get/set的对象
 * @param {number} itemCount - 项目总数
 * @returns {Object} - 滑动相关的状态和方法
 */
export function useSwipe(currentIndex, itemCount = 3) {
  const slideOffset = ref(0)     // 滑动偏移量
  const isSliding = ref(false)   // 是否正在滑动
  const startX = ref(0)          // 开始触摸的位置
  const contentWidth = ref(0)    // 内容宽度
  const touchStartTime = ref(0)  // 触摸开始时间
  const initialScroll = ref(0)   // 初始滚动位置
  const minSlideTime = 20        // 滑动至少需要持续的毫秒数 (降低以提高灵敏度)
  const isVerticalScroll = ref(false) // 是否识别为垂直滚动
  const isPageStable = ref(false) // 页面是否稳定
  const startY = ref(0)          // 开始触摸的垂直位置
  const lastX = ref(0)           // 上一次触摸的位置，用于计算速度
  const lastTime = ref(0)        // 上一次触摸的时间，用于计算速度
  const velocityX = ref(0)       // 水平滑动速度

  // 在组件挂载后获取元素宽度
  onMounted(() => {
    // 获取内容容器宽度
    const container = document.querySelector('.content-container')
    if (container) {
      contentWidth.value = container.offsetWidth
    }
    
    // 延迟启用滑动功能，等待页面稳定
    setTimeout(() => {
      isPageStable.value = true
    }, 300) // 300毫秒后启用滑动功能 (降低以提高初始化速度)
  })

  // 切换标签页
  const switchTab = (index) => {
    if (typeof currentIndex === 'object' && 'value' in currentIndex) {
      // 如果是ref
      currentIndex.value = index
    } else if (typeof currentIndex === 'object' && 'set' in currentIndex) {
      // 如果是具有get/set的对象
      currentIndex.set(index)
    }
    slideOffset.value = 0
  }

  // 获取当前索引值
  const getCurrentIndex = () => {
    if (typeof currentIndex === 'object' && 'value' in currentIndex) {
      return currentIndex.value
    } else if (typeof currentIndex === 'object' && 'get' in currentIndex) {
      return currentIndex.get()
    }
    return 0
  }
  
  // 检查是否是水平滑动
  const isHorizontalSwipe = (deltaX, deltaY) => {
    // 如果已经确定是垂直滚动，直接返回false
    if (isVerticalScroll.value) {
      return false;
    }
    return Math.abs(deltaX) > Math.abs(deltaY) * 1.8 && Math.abs(deltaX) > 20;
  }

  // 检查是否是垂直滑动
  const isVerticalSwipe = (deltaX, deltaY) => {
    return Math.abs(deltaY) > Math.abs(deltaX) * 1.5 && Math.abs(deltaY) > 20;
  }

  // 带边界阻尼效果的计算偏移量
  const calculateOffsetWithDamping = (rawOffset) => {
    const currentIdx = getCurrentIndex()
    // 如果已经在第一页或最后一页，添加边界阻尼效果
    if ((currentIdx === 0 && rawOffset > 0) || 
        (currentIdx === itemCount - 1 && rawOffset < 0)) {
      return rawOffset * 0.25 // 减小阻尼系数，使边界滑动更困难
    }
    // 对所有滑动使用适中的阻尼效果
    return rawOffset * 0.92 // 增加灵敏度，使滑动更加流畅
  }

  // 更新速度计算
  const updateVelocity = (currentX, currentTime) => {
    if (lastX.value && lastTime.value) {
      const deltaX = currentX - lastX.value;
      const deltaTime = currentTime - lastTime.value;
      if (deltaTime > 0) {
        // 速度计算 (像素/毫秒)
        velocityX.value = deltaX / deltaTime;
      }
    }
    lastX.value = currentX;
    lastTime.value = currentTime;
  }

  // 触摸相关函数
  const touchStart = (e) => {
    // 如果页面不稳定，不处理滑动
    if (!isPageStable.value) return
    
    const currentTime = Date.now();
    touchStartTime.value = currentTime;
    const touch = e.touches[0];
    startX.value = touch.clientX;
    startY.value = touch.clientY;
    initialScroll.value = window.scrollY;
    isVerticalScroll.value = false; // 重置垂直滚动标志
    lastX.value = touch.clientX;
    lastTime.value = currentTime;
    velocityX.value = 0;
    
    // 如果宽度未初始化，在这里初始化
    if (!contentWidth.value) {
      const container = e.currentTarget
      if (container) {
        contentWidth.value = container.offsetWidth
      }
    }
  }

  const touchMove = (e) => {
    // 如果页面不稳定，不处理滑动
    if (!isPageStable.value) return
    
    const currentTime = Date.now();
    const touch = e.touches[0];
    const currentX = touch.clientX;
    const currentY = touch.clientY;
    const deltaX = currentX - startX.value;
    const deltaY = currentY - startY.value;
    
    // 更新速度计算
    updateVelocity(currentX, currentTime);
    
    // 检查是否是垂直滑动
    if (!isSliding.value && !isVerticalScroll.value && isVerticalSwipe(deltaX, deltaY)) {
      isVerticalScroll.value = true;
      return; // 如果是垂直滑动，直接返回，不处理水平滑动
    }
    
    // 已经判定为垂直滑动，忽略所有水平滑动处理
    if (isVerticalScroll.value) {
      return;
    }
    
    // 判断是否是水平滑动
    if (!isSliding.value && Math.abs(deltaX) > 20) {  // 降低触发阈值到20px，提高灵敏度
      if (isHorizontalSwipe(deltaX, deltaY) && (currentTime - touchStartTime.value) > minSlideTime) {
        isSliding.value = true
        e.preventDefault() // 阻止默认行为
      }
    }
    
    if (isSliding.value) {
      // 计算带阻尼效果的偏移量
      slideOffset.value = calculateOffsetWithDamping(deltaX)
      e.stopPropagation() // 阻止事件冒泡
    }
  }

  const touchEnd = (e) => {
    // 如果页面不稳定，不处理滑动
    if (!isPageStable.value) return
    
    // 如果是垂直滑动，不处理水平滑动相关逻辑
    if (isVerticalScroll.value) {
      isVerticalScroll.value = false;
      return;
    }
    
    if (!isSliding.value) return
    
    finishSlide()
    e.stopPropagation() // 阻止事件冒泡
  }

  // 鼠标相关函数（为了在桌面浏览器上也能测试）
  const mouseStart = (e) => {
    // 如果页面不稳定，不处理滑动
    if (!isPageStable.value) return
    
    const currentTime = Date.now();
    touchStartTime.value = currentTime;
    startX.value = e.clientX;
    startY.value = e.clientY;
    initialScroll.value = window.scrollY;
    isVerticalScroll.value = false; // 重置垂直滚动标志
    lastX.value = e.clientX;
    lastTime.value = currentTime;
    velocityX.value = 0;
    
    // 如果宽度未初始化，在这里初始化
    if (!contentWidth.value) {
      const container = e.currentTarget
      if (container) {
        contentWidth.value = container.offsetWidth
      }
    }
    
    // 为了启用拖拽，添加这些事件处理
    document.addEventListener('mousemove', mouseMove)
    document.addEventListener('mouseup', mouseEnd)
  }

  const mouseMove = (e) => {
    // 如果页面不稳定，不处理滑动
    if (!isPageStable.value) return
    
    const currentTime = Date.now();
    const currentX = e.clientX;
    const currentY = e.clientY;
    const deltaX = currentX - startX.value;
    const deltaY = currentY - startY.value;
    
    // 更新速度计算
    updateVelocity(currentX, currentTime);
    
    // 检查是否是垂直滑动
    if (!isSliding.value && !isVerticalScroll.value && isVerticalSwipe(deltaX, deltaY)) {
      isVerticalScroll.value = true;
      return; // 如果是垂直滑动，直接返回，不处理水平滑动
    }
    
    // 已经判定为垂直滑动，忽略所有水平滑动处理
    if (isVerticalScroll.value) {
      return;
    }
    
    // 判断是否是水平滑动
    if (!isSliding.value && Math.abs(deltaX) > 20) {  // 降低触发阈值到20px，提高灵敏度
      if (isHorizontalSwipe(deltaX, deltaY) && (currentTime - touchStartTime.value) > minSlideTime) {
        isSliding.value = true
        e.preventDefault() // 阻止默认行为
      }
    }
    
    if (isSliding.value) {
      // 计算带阻尼效果的偏移量
      slideOffset.value = calculateOffsetWithDamping(deltaX)
      e.stopPropagation() // 阻止事件冒泡
    }
  }

  const mouseEnd = (e) => {
    // 如果页面不稳定，不处理滑动
    if (!isPageStable.value) return
    
    // 移除事件监听
    document.removeEventListener('mousemove', mouseMove)
    document.removeEventListener('mouseup', mouseEnd)
    
    // 如果是垂直滑动，不处理水平滑动相关逻辑
    if (isVerticalScroll.value) {
      isVerticalScroll.value = false;
      return;
    }
    
    if (!isSliding.value) return
    
    finishSlide()
    if (e) e.stopPropagation() // 阻止事件冒泡
  }

  // 滑动结束，决定是否切换页面
  const finishSlide = () => {
    // 计算滑动比例
    const slideRatio = Math.abs(slideOffset.value) / (contentWidth.value * 0.35) // 降低到需要滑动35%就可以切换
    const swipeTime = Date.now() - touchStartTime.value
    
    // 使用计算的速度而不是简单的距离/时间
    const absVelocity = Math.abs(velocityX.value);
    
    // 如果滑动时间太短，不处理
    if (swipeTime < minSlideTime) {
      isSliding.value = false
      slideOffset.value = 0
      return
    }
    
    // 如果滑动足够距离或速度足够快
    if (slideRatio > 1 || absVelocity > 0.6) {  // 降低速度阈值到0.6，使快速滑动更灵敏
      const curIndex = getCurrentIndex()
      
      if (slideOffset.value < 0 && curIndex < itemCount - 1) {
        // 向左滑动，切换到下一页
        switchTab(curIndex + 1)
      } else if (slideOffset.value > 0 && curIndex > 0) {
        // 向右滑动，切换到上一页
        switchTab(curIndex - 1)
      }
    }
    
    // 重置滑动状态
    isSliding.value = false
    slideOffset.value = 0
  }

  return {
    slideOffset,
    isSliding,
    startX,
    contentWidth,
    touchStart,
    touchMove,
    touchEnd,
    mouseStart,
    mouseMove,
    mouseEnd,
    switchTab,
    isPageStable
  }
} 